home *** CD-ROM | disk | FTP | other *** search
-
- /*
- THf再び…
-
- By 五味
-
- */
-
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
-
- #define uchar unsigned char
-
- #define MAX_LB 4096
- #define MAX_RK 128
-
- /*
-
- 変数定義
-
-
- */
- FILE *rp,*wp; /* 読み込み、書き込みのファイル */
- char fname[128],rname[128]; /* 書き込み、読み込みファイル名 */
- char linebuf[MAX_LB+2]; /* 行加工のバッファ */
- char ichar; /* インデント用文字 */
- char *u; /* ファイル名加工用ポインタ */
- int tof; /* インデントの深さ */
- int sof; /* 文章の横のオフセット */
- int vof; /* 加工時のポインタ */
- int ilen; /* インデントの単位幅 */
- int i,j,l; /* 汎用(ループ等)数値 */
- int letter; /* 文字(半角か、全角の最初) */
- int letter2; /* 文字(全角の2バイト目) */
- int wide; /* 文章の全体幅 */
- int line; /* 行カウンタ */
- int nulis; /* 空行をスキップにするか */
- int rema; /* 可能性フラグ */
- int ntran; /* 非加工フラグ */
- int tmpi; /* テンポラリ・インデント */
- int tmps; /* テンポラリ・インデント補助 */
- int fret; /* フォーマット・リターン */
- int frets; /* フォーマット・リターン補助 */
-
- char form[1024]; /* フォーマット記録 */
- char formbak[1024]; /* フォーマット記録の保存用 */
- int howbak; /* フォーマット一時解除か否か */
- int forp; /* フォーマットのポインタ */
- int forep; /* フォーマットリピートポインタ */
- int forepend; /* フォーマットエンドポインタ */
- char forbuf[4096]; /* フォーマット展開バッファ */
- char strbuf[4096]; /* 文字列展開バッファ */
- int forbp; /* フォーマット展開の現在値 */
- int folg; /* 展開中(1)か否か(0) */
- int fof; /* フォーマットエンドフラグ */
- int dumo; /* ダミー文字列フラグ */
- uchar othch; /* 区切り文字 */
-
- int istab; /* タブ中か */
- int tabsize; /* タブサイズ */
-
-
- unsigned int rc[MAX_RK]={ '、','。',',','.','・',':',';','?',
- '!','゛','゜','ヽ','ヾ','ゝ','ゞ','〃',
- '々','ー','―','‐','~','…','‥','’',
- '”',')','〕',']','}','〉','》','」',
- '』','】','>','°','′','″','℃','%',
- '≫','‰','♯','♭','♪','Å','ぁ','ぃ',
- 'ぅ','ぇ','ぉ','っ','ゃ','ゅ','ょ','ァ',
- 'ィ','ゥ','ェ','ォ','ッ','ャ','ュ','ョ',
- 'ゎ','ヵ','ヶ','ヮ',' ','\n' };
- /* 留める文字(全角) */
- unsigned int fc[MAX_RK]={ '‘','“','(','〔','[','〈','《','「',
- '『','【','+','-','±','×','÷','<',
- '≪','√','\n' };
- /* 吐き出す文字(全角) */
- unsigned char ra[MAX_RK] = "#$%),.、。」>]?!ァィゥェォッー\t \n";
- /* 留める文字(半角) */
- unsigned char fa[MAX_RK] = "(「[<\n";
- /* 吐き出す文字(半角) */
- char *ko[]={ "□","■","○","●","☆","★","◇","◆","§","◎" };
- /* 項目abの文字 */
-
- /*
-
- 関数定義
-
-
- */
-
- void shift(int val,FILE *pp) /* 空白(タブ)で横ずらし */
- {
- for( i=0 ; i<val/tabsize ; i++ )
- fputc('\t',pp);
- for( i=0 ; i<val%tabsize ; i++ )
- fputc(ichar,pp);
-
- return;
- }
-
- void testinit(void) /* 書式関係の初期化 */
- {
- forp = 0;
- forep = 0;
- forbuf[0] = 0;
- forbp = 0;
- folg = 0;
- fof = 0;
- forepend= 0;
- }
-
- char *tok(char *pp) /* 書式の単位文字列の読み取り */
- {
- int ll,ol;
-
- while( (ll=fgetc(rp))!=EOF )
- if( ll!=othch && ll!='\n' )
- break;
-
- if( ll=='/' )
- {
- *pp = '\0';
- while( (ll=fgetc(rp))!=EOF )
- if( ll==othch || ll=='\n' )
- break;
- return(pp);
- } /* ヌル文字列処理 */
- else
- ungetc(ll,rp);
-
- ol='\0';
- while( (ll=fgetc(rp))!=EOF )
- if( ll==othch || ll=='\n' )
- break;
- else
- *(pp++) = ol = ll;
- if( ol=='/' )
- {
- fof=1;
- *(pp-1)='\0';
- } /* 書式ループ終了指定子処理 */
-
- if( ll==EOF )
- {
- printf(" 正常終了\n");
- exit(0);
- }
-
- *pp = '\0';
- return(pp);
-
- }
-
- int ktest(FILE *pp) /* 書式やタブからの文字の読み取り */
- {
- int ll;
-
- if( istab>0 )
- {
- istab--;
- return(ichar);
- }
- else if( folg!=0 )
- {
- ll = forbuf[forbp++];
- if( forbuf[forbp]==0 )
- folg=0;
- if( ll=='\t' && othch=='\n' )
- {
- istab=1;
- for( i=0 ; (vof+i+1)%tabsize!=0 ; i++ );
- istab+=i;
- return(ktest(pp));
- }
- return(ll);
- }
- else if( forp==forepend && forepend!=0 )
- {
- if( fof==1 )
- {
- forp = forepend+1;
- forepend= 0;
- fof = 0;
- return( ktest(pp) );
- } /* 後尾のスラッシュでの書式終了*/
- else
- {
- forp=forep;
- if( form[forp]==0 )
- {
- printf("%s %d: 書式設定が無限ループしています.\n",rname,line);
- exit(1);
- }
- return( ktest(pp) );
- }
- }
- else if( form[forp]=='\0' )
- {
- testinit();
- return(0);
- }
- else if( form[forp]=='&' )
- {
- forep = ++forp;
- for( forepend=forp ; form[forepend]!='\0' && form[forepend]!='&' ; forepend++);
- return( ktest(pp) );
- }
- else if( form[forp]=='\\' )
- {
- forp++;
- switch(form[forp++])
- {
- case'n':
- return('\n');
- case't':
- return('\t');
- case'r':
- folg = 1;
- l = atoi(&(form[forp]));
- do {
- letter=form[forp++];
- }while( letter>='0' && letter <='9' );
- forp--;
- for( i=0 ; i<l ; i++ )
- forbuf[i]=ichar;
- forbuf[l]='\0';
- forbp = 0;
- return( ktest(pp) );
- }
- }
- else if( form[forp]!='%' )
- return( form[forp++] );
- else
- {
- forp++;
- folg = 1;
- tok(strbuf); /* 文書からの文字列の読み出し */
-
- if( form[forp]=='<' )
- { /* ベース式 */
- forp++;
- for( l=0 ; form[forp+l]!='>' ; l++ )
- forbuf[l] = form[forp+l];
- forbuf[l] = 0;
- forp += l+1;
-
- j=l-strlen(strbuf);
- if( form[forp]=='-' )
- j=0;
-
- if( l<strlen(strbuf) )
- strcpy(forbuf,strbuf);
- else
- {
- do {
- letter = form[forp++];
- }while( letter!='s' && letter!='c' );
- if( letter=='c' )
- j = (l-strlen(strbuf))/2;
- for( l=0 ; l<strlen(strbuf) ; l++ )
- forbuf[j+l] = strbuf[l];
- }
- }
- else
- if( form[forp]=='Z' ) /* 右寄せ式 */
- {
- forp++;
- for( i=0 ; i<wide-strlen(strbuf) ; i++ )
- forbuf[i]=ichar;
- strcpy(&forbuf[i],strbuf);
- }
- else
- if( form[forp]=='C' ) /* センタリング式 */
- {
- forp++;
- for( i=0 ; i<(wide-strlen(strbuf))/2 ; i++ )
- forbuf[i]=ichar;
- strcpy(&forbuf[i],strbuf);
- }
- else
- { /* width式 */
- j = atoi(&(form[forp]));
- do {
- letter = form[forp++];
- }while( letter!='s' && letter!='c' );
-
- if( j==0 || j<=strlen(strbuf) )
- strcpy(forbuf,strbuf);
- else
- {
-
- if( j<0 )
- {
- j*=-1;
- if( (l=j-strlen(strbuf))<0 )
- l=0;
- }
- else
- l=0;
-
- if( letter=='c' )
- l = (j-strlen(strbuf))/2;
-
- for( i=0 ; i<j ; i++ )
- forbuf[i] = ichar;
- forbuf[i] = 0;
-
- for( i=0 ; i<j && strbuf[i]!=0 ; i++ )
- forbuf[l+i] = strbuf[i];
-
- }
- }
-
- forbp = 0;
- return( ktest(pp) );
-
- }
-
- }
-
- int test(FILE *pp) /* EOF判定の付いたfgetc */
- {
- int ll;
-
- if( ( ll=fgetc(pp) )==EOF )
- {
- printf(" 正常終了\n");
- exit(0);
- }
-
- return(ll);
- }
-
- char *center(char *lbuf,FILE *pp) /* センタリング */
- {
- size_t ls;
-
- if( (ls=strlen(lbuf))>=(wide-sof) )
- {
- printf("%s %d: センタリングの文字が長すぎます.\n",rname,line);
- exit(1);
- }
-
- shift(sof+(wide-sof-ls)/2,pp);
-
- fprintf(wp,"%s\n",lbuf);
- return(lbuf);
-
- }
-
- char *right(char *lbuf,FILE *pp) /* 右寄せ */
- {
- size_t ls;
-
- if( (ls=strlen(lbuf))>=wide )
- {
- printf("%s %d: 右寄せの文字が長すぎます.\n",rname,line);
- exit(1);
- }
-
- shift(wide-ls,pp);
-
- fprintf(wp,"%s\n",lbuf);
- return(lbuf);
-
- }
-
- void indent(FILE *pp) /* インデントをつける */
- {
- vof = sof + tmpi*tmps + tof*ilen;
-
- shift(vof,pp);
-
- tmps = 1;
- istab= 0;
- }
-
- int pararead(FILE *pp) /* ストリームから数字を読み取る */
- {
- int ll;
-
- do {
- ll = test(rp);
- }while( ll=='\t' || ll==' ' );
- ungetc(ll,rp);
-
- fgets(linebuf,MAX_LB+1,rp);
- return(atoi(linebuf));
-
- }
-
- char *bunread(FILE *pp) /* ストリームから文字列を読み取る*/
- {
- int ll;
-
- do {
- ll = test(rp);
- }while( ll=='\t' || ll==' ' );
- ungetc(ll,rp);
-
- fgets(linebuf,MAX_LB+1,rp);
- *(linebuf+strlen(linebuf)-1) = 0;
- return(linebuf);
-
- }
-
- void cont_read(void) /* コントロール行を処理する */
- {
-
- switch( letter=test(rp) )
- {
- case'a':
- tof++; /* 順序関係あり */
- case'b':
- fprintf(wp,"\n");
- letter=test(rp);
- if( '0'<=letter && letter<='9' )
- {
- indent(wp);
- fprintf(wp,"%s%s\n\n",ko[letter-'0'],bunread(rp));
- }
- else
- if( letter=='a' )
- {
- center(bunread(rp),wp);
- fprintf(wp,"\n");
- }
- else
- {
- indent(wp);
- fprintf(wp,"%s\n\n",bunread(rp));
- }
- break;
- case'c':
- center(bunread(rp),wp);
- break;
-
- case'd':
- if( (letter=test(rp))=='d' )
- if( howbak )
- {
- strcpy(form,formbak);
- howbak=0;
- }
- else
- {
- strcpy(formbak,form);
- howbak=1;
- }
- else
- if( letter!='i' )
- {
- ungetc(letter,rp);
- if( letter=='\n' )
- strcpy(form,"%s");
- else
- {
- do {
- letter = test(rp);
- }while( letter=='\t' || letter==' ' );
- for( i=0 ; (letter2=test(rp))!=letter ; i++ )
- form[i] = letter2;
- form[i] = 0;
- }
- }
- testinit();
- while( test(rp)!='\n' );
- break;
-
- case'i':
- letter=test(rp);
- if( letter=='w' )
- ilen = pararead(rp);
- else
- if( letter=='c' )
- {
- do{ letter = test(rp); }while( letter=='\t' || letter==' ' );
- for( i=0 ; (letter2=test(rp))!=letter ; i++ )
- ichar = letter2;
- while( test(rp)!='\n' );
- }
- else
- if( letter=='\n' )
- tof++;
- else
- tof += pararead(rp);
-
-
- fprintf(wp,"\n");
- break;
-
- case'n':
- if( (letter=test(rp))=='s' )
- nulis = 1;
- else
- {
- ungetc(letter,rp);
- nulis = 0;
- }
-
- while( test(rp)!='\n' );
- break;
-
- case'o':
- letter=test(rp);
- if( letter=='\n' )
- tof--;
- else
- tof -= pararead(rp);
-
- if( tof<0 ) tof=0;
-
- fprintf(wp,"\n");
- break;
-
- case'r':
- letter=test(rp);
- if( letter=='\n' )
- fprintf(wp,"\n");
- else
- {
- ungetc(letter,rp);
- j = pararead(rp);
- for( i=0 ; i<j ; i++ )
- fprintf(wp,"\n");
- }
-
- break;
-
- case'm':
- fprintf(wp,"\n\n\n\n\n");
- tof=0; /* 順変更不可 */
- case's':
- letter = test(rp);
- if( letter=='i' )
- tmpi = pararead(rp);
- else
- {
- fprintf(wp,"\n");
- indent(wp);
- fprintf(wp,"【%s】\n\n",bunread(rp));
- tof++;
- }
- break;
-
- case't':
- letter = test(rp);
- if( letter=='o' )
- {
- othch='\t';
- while( test(rp)!='\n' );
- }
- else
- if( letter=='n' )
- {
- othch='\r';
- while( test(rp)!='\n' );
- }
- else
- if( letter=='s' )
- tabsize = pararead(rp);
- else
- {
- ungetc(letter,rp);
- fprintf(wp,"\n\n");
- center(bunread(rp),wp);
- fprintf(wp,"\n\n");
- }
- break;
-
- case'u':
- ntran ^= 1;
- while( test(rp)!='\n' );
- break;
-
- case'w':
- wide = pararead(rp);
- break;
-
- case'f':
- fret = pararead(rp);
- break;
-
- case'x':
- sof = pararead(rp);
- break;
-
- case'z':
- right(bunread(rp),wp);
- break;
-
- }
-
- }
-
- void tform(void) /* 読んだ文字を整形する(禁足処理等) */
- {
-
- if( frets==1 )
- {
- for( i=0 ; i<fret ; i++ )
- fprintf(wp,"\n");
- frets=0;
- }
-
- indent(wp);
- if( vof >= wide )
- {
- printf("%s %d: インデントが深すぎて、文が書けません.",rname,line);
- exit(1);
- }
-
- while( (letter=ktest(rp))!=NULL )
- {
- if( 0x80<letter && letter<0xA0 || 0xDF<letter )
- {
- letter2=ktest(rp);
- if( vof+2 > wide )
- {
- rema = 0;
- for( i=0 ; rc[i]!='\n' ; i++ )
- if( rc[i]==((unsigned)letter2 + (unsigned)letter*0x100) )
- rema = 1;
-
- if( rema==0 )
- {
- fprintf(wp,"\n");
- indent(wp);
- }
- }
- else if( vof+4 > wide )
- {
- rema = 0;
- for( i=0 ; fc[i]!='\n' ; i++ )
- if( fc[i]==((unsigned)letter2 + (unsigned)letter*0x100) )
- rema = 1;
-
- if( rema==1 )
- {
- fprintf(wp,"\n");
- indent(wp);
- }
- }
-
-
- fputc((char)letter ,wp);
- fputc((char)letter2,wp);
- vof += 2;
-
- }
- else
- {
- if( vof > wide )
- {
- rema = 0;
-
- for( i=0 ; ra[i]!='\n' ; i++ )
- if( ra[i]==(uchar)letter )
- rema = 1;
-
- if( rema==0 )
- {
- fprintf(wp,"\n");
- indent(wp);
- }
- }
- else if( vof+1 > wide )
- {
- rema = 0;
-
- for( i=0 ; fa[i]!='\n' ; i++ )
- if( fa[i]==(uchar)letter )
- rema = 1;
-
- if( rema==1 )
- {
- fprintf(wp,"\n");
- indent(wp);
- }
- }
-
-
- vof++;
- fputc((char)letter,wp);
-
- if( letter=='\n' )
- {
- tmps=0; /* リターンならsiが無効 */
- indent(wp);
- }
-
- }
-
-
-
-
- }
-
-
- fprintf(wp,"\n");
- if( fret>0 ) frets=1;
-
- }
-
- void main(int argc,char *argv[],char *envp[]) /* メイン */
- {
-
- printf("\n “THf”テキスト・フォーマッタ V2.3a");
- printf("\n (c) Hisashi Gomi 1993/1/30\n\n");
-
- if( argc==1 )
- {
- printf(" [使い方] THf <入力ファイル名> [出力時の拡張子]\n");
- exit(0);
- }
-
- strcpy(rname,argv[1]);
- if( (u=strchr(rname,'.'))==NULL )
- strcat(rname,".thf");
-
- if( (rp = fopen(rname,"r"))==NULL )
- {
- printf("%s : ファイルがオープンできません.\n",rname);
- exit(2);
- }
-
-
- strcpy(fname,rname);
- u = strchr(fname,'.');
- *u = 0;
-
- if( argc==2 )
- strcat(fname,".doc");
- else
- {
- strcat(fname,".");
- strcat(fname,argv[2]);
- }
-
- if( (wp = fopen(fname,"w"))==NULL )
- {
- printf("%s : ファイルがオープンできません.\n",fname);
- exit(2);
- }
-
-
-
- sof = 0;
- tof = 0;
- ilen = 4;
- ichar = ' ';
- othch = '\n';
- wide = 72;
- line = 1;
- nulis = 0;
- ntran = 0;
- tmpi = 0;
- fret = 0;
- frets = 0;
- istab = 0;
- tabsize = 8;
- howbak= 0;
-
-
- testinit();
- strcpy(form,"%s");
-
-
- while( 1 )
- {
- tmps = 0;
-
- if( (letter=test(rp))=='.' )
- {
- cont_read();
- frets = 0;
- }
- else if( ntran==1 )
- {
- ungetc(letter,rp);
- fgets(linebuf,MAX_LB+1,rp);
- fprintf(wp,"%s",linebuf);
- }
- else if( letter=='\n' )
- {
- fprintf(wp,"\n");
- if( nulis!=0 && tof>0 )
- tof--;
- }
- else if( letter=='#' )
- while( test(rp)!='\n' );
- else
- {
- ungetc(letter,rp);
- tform();
- }
-
- line++;
-
- }
-
- }
-